package src;
import java.util.Arrays;

public class GeneratorWithoutRepetition {
    /**
     * Pole v ktorom generujeme variacie
     */
    private int[] pole;

    /**
     * Pole, v ktorom uchovavame, ci sa hodnota i (i=1..n) nachadza v poli pole.
     */
    private boolean[] uzBolo;

    /**
     * Urcuje velkost mnoziny, z ktorej vytvarame variacie bez opakovania ({1,
     * ..., n})
     */
    private int n;

    private void vypis() {
    	System.out.println(Arrays.toString(pole));
    }

    private void generuj(int odIndexu) {
	    // Ak sme vygenerovali vsetky hodnoty v poli, tak pole vypiseme
	    if (odIndexu == pole.length) {
	        vypis();
	        return;
	    }
	
	    for (int i = 1; i <= n; i++) {
	        // Cislo i ulozime do pola, iba ak sa este nenachadza na indexoch
	        // 0..(odIndexu-1)
	        if (!uzBolo[i]) {
	            // Poznacime si pridanie hodnoty i do pola
	            uzBolo[i] = true;
	            pole[odIndexu] = i;
	            // Generujeme variacie bez opakovania od indexu odIndexu+1
	            generuj(odIndexu + 1);
	            // pole[odIndexu] = 0;
	            // Poznacime si odobratie hodnoty i z pola
	            uzBolo[i] = false;
	        }
	    }
    }

    public void generuj() {
    	generuj(0);
    }

    public GeneratorWithoutRepetition(int n, int k) {
	    // Ulozime si parameter n
	    this.n = n;
	    // Vytvorime pole, do ktoreho budeme generovat variacie
	    pole = new int[k];
	    // Vytvorime pole s indexami 0..n, v ktorom si pre cisla v rozsahu 1..n
	    // budeme pamatat, ci sme ich pouzili
	    uzBolo = new boolean[n + 1];
    }

    public static void main(String[] args) {
	    GeneratorWithoutRepetition g = new GeneratorWithoutRepetition(2, 2);
	    g.generuj();
    }
}